MVC #1
NOTE
웹 서버/WAS 구성, 서블릿과 서블릿 컨테이너, 멀티스레드 처리, SSR/CSR, 자바 웹 기술의 역사, 그리고 MVC 패턴(Servlet + JSP) 적용까지 정리한다.
📌 개념
웹서버 구성
-
web server ( apache )
- 정적 리소스를 주는 용도
-
was server ( tomcat )
- 애플리케이션 로직을 처리할 수 있는 동적 처리 서버
- 정적 리소스도 처리할 수 있지만, web server 를 활용한다
NOTE
web server를 사용하는 이유
- WAS는 장애가 있을 시 오류 화면조차 제대로 보여주지 못할 수 있다
- WAS는 비즈니스 로직을 다루므로 상대적으로 에러가 잦다
-
DB
- 비즈니스 로직을 실행하기 위해 데이터를 저장하는 역할
서블릿
- 서블릿의 역할
- TCP/IP 통신 연결
- HTTP 요청 파싱
- HTTP 응답 메시지 생성 및 전달
- 비즈니스 로직 외 모든 통신 역할 담당
- 서블릿 사용 방법
- HttpServelet 클래스 상속
- service 메서드 오버라이딩 (재정의)
- request & response 객체를 파라미터로 사용
- 본문에 애플리케이션 로직을 구현
- HttpServelet 클래스 상속
- WAS 에서 서블릿을 이용해 HTTP 요청 & 응답 정보를 파싱 및 생성함
- 서블릿 컨테이너
- 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함
- 서블릿 객체의 생성/초기화/호출/종료의 생명주기 관리
- 서블릿은 싱글톤으로 관리된다 ( 공유되어 사용 )
- 공유변수 사용 주의 (싱글톤의 주의할점)
- 동시 요청을 위한 멀티쓰레드 처리 지원
- 쓰레드가 서블릿 컨테이너를 호출
동시요청 (멀티쓰레드)
- 쓰레드 마다 서블릿 컨테이너를 호출하므로, 호출이 있을때마다 쓰레드 생성 (?)
- 쓰레드 호출시 생성 장점
- 동시 요청 처리 가능
- 리소스 제한 내에 처리 가능
- 병렬 처리 가능
- 쓰레드 호출시 생성 단점
- 쓰레드 컨텍스트 스위칭 비용이 발생
- 쓰레드 생성에 제한이 없음 (리소스 제한을 넘길 수 있음)
- 쓰레드 호출시 생성 장점
- 쓰레드 풀 사용
- 쓰레드 개수를 지정
- 장점
- 리소스 제한 범위를 넘지 못한다
- 쓰레드가 미리 생성되어있으므로, 생성 및 소멸 비용을 줄일 수 있다.
- 장점
- 톰캣의경우 default 값으로 쓰레드 개수가 200개 이다. (변경 가능)
- 쓰레드 풀 적정 숫자
- 성능 테스트 툴
- 아파치 ab
- 제이미터
- nGrinder
- 성능 테스트 툴
- WAS의 멀티 쓰레드 지원
- 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
- 멀티쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
- 이건 한번 직접 짜봐야징
- 쓰레드 개수를 지정
HTML, HTTP, API, CSR, SSR
- 정적 리소스
- CSS
- JS
- 이미지
- 영상
- 고정된 html
- 동적 HTML
- View template 을 사용
- WAS에서 동적으로 생성된 html을 보여줌
- HTTP API
- html을 전달하는 것이 아닌 데이터를 전송
- 주로 json을 사용
- HTTP API 사용 시기
- UI 화면이 필요하다면 클라이언트가 별도 처리
- 웹 클라이언트 : vue, react
- 데이터만 필요한 경우 사용
- 사용 목적
- 앱 클라리언트 to 서버
- 웹 클라이언트 to 서버
- 서버 to 서버
- UI 화면이 필요하다면 클라이언트가 별도 처리
- 서바사이드 렌더링 (SSR)
- JSP, Thymeleaf 같은 것을 이용하여 동적으로 html 을 생성
- 서버에서 html을 생성해서 웹 브라우저에 전달
- 클라이언트 사이드 렌더링 (CSR)
- html을 받는 것이 아닌, javascript를 받아서 클라이언트 쪽에서 렌더링
- 부분 변경이 가능 → html DOM
- 주로 동적인 화면에서 사용
- 동작 구성
- 클라이언트
- HTML 요청 → 본문 내용은 없음
- 자바스크립트 요청
- HTTP API를 이용하여 데이터 요청
- js + 클라이언트 로직 + 데이터 를 이용하여 렌더링
- 서버
- 요청받은 HTML에 JS 링크 응답
- 클라이언트 로직 + HTML 렌더링 코드 응답
- JSON 형태로 데이터 응답
- 클라이언트
- UI 학습 방향성
- 백엔드
- SSR은 필수적으로 할 줄 알아야 한다
- JSP, Thymeleaf를 이용 (요즘 추세는 JSP는 사장되고, Thymeleaf가 뜨고 있음 → thymeleaf는 spring이 밀고 있음)
- 화면이 복잡하지 않을 때 사용
- 프론트엔드
- 복잡하고 동적인 UI 사용
- React, Vue.js ( 요즘 추세는 React 이다)
- 백엔드 개발자의 경우, 웹프론트앤드 쪽을 배우는 것은 옵션이다
- 백엔드
자바 웹 기술 역사
- 서블릿
- HTML 생성이 어려움 ( JAVA코드로 구현해야하므로 )
- JSP
- HTML생성이 편리, 비즈니스 로직 까지 많은 역할 담당
- 너무 많은 것을 담당하는게 독이됨 (유지보수에 어려움)
- → MVC 탄생 배경
- 서블릿 + JSP 를 조합하여 MVC 패턴 사용
- MVC 프레임워크 춘추 전국 시대
- 스트럿츠 ( 그때의 강세 프레임워크 )
- 웹워크
- 스프링 MVC (과거 버전)
- 애노테이션 기반 MVC
- 웹 프레임워크의 정점을 찍음
- 이후, 스프링 부트의 등장
- 스프링 부트는 WAS를 내장하고 있어서 편리한 빌드 배포 과정을 가짐
- 최신 기술
- Web Servlet - Spring MVC
- Web Reactive - WebFlux
- WebFlux
- 특징
- 비동기 , 논블럭 처리
- 최소 쓰레드 최대 성능 → 컨테스트 스위칭 비용 최소화
- 함수형 스타일로 개발 → 동시처리 코드 효율화
- 서블릿 기술을 사용하지 않음 → 다른 웹 프레임워크를 사용
- Node.js 처럼 사용 가능
- 성능을 중요시하거나, 로직 자체가 무거우면 사용
- 단점
- RDB 지원이 부족하다
- 실무에서 아직 많이 사용하지는 않음
- 특징
- WebFlux
자바 뷰 템플릿 역사
- HTML 을 편리하게 생성하는 뷰 기능
- 종류
- JSP
- 속도 느림, 기능 부족
- 프리마커, 벨로시티
- 속도 문제해결 ,다양한 기능
- 업데이트를 잘 안함
- Thymeleaf
- HTML 모양을 유지하면서 뷰 템플릿 적용 가능
- 스프링 MVC와 호환이 좋음
- 성능의 경우, 프리마커/벨로시티가 좋음
- JSP
Spring initializer
- JSP를 사용하려면 패키징을 War로 사용해야한다
- dependency
- spring web
- lombok
서블릿
- spring boot 에서 servlet 등록 방법
- @WebServlet 으로 서블릿 등록
- urlPattern 으로 해당 url 정보 파싱 가능 (http 요청 / 응답)
- service 메서드 오버라이딩
- @WebServlet 으로 서블릿 등록
- request, response
- request : 요청 받은 정보 파싱
- response : 응답을 보냄
- get 방식 값 추출
- request.getParameter(”필드”);
- post 방식 값 추출
- request.getParameter(”필드”);
요청/응답 방식
- GET 방식
- POST - html Form
- content-Type : x-www-form-urlencoded
- HTTP message body (API 형태)
- content-Type : application/json
응답 헤더
- 상태 응답 코드
- 쿠키값
- content -type
- redirect
서블릿의 단점
- 자바를 이용하여 동적인 html을 만들 수 있으나, html을 작성하는게 너무 귀찮다 ( java 코드에 html을 넣는 것)
- → 템플릿 엔진 사용 (ex : JSP, ThymeLeaf)
- 템플릿 엔진은 html문서에 java 코드를 넣는 것
JSP
- <% ~~ %> : JSP파일 내부에서 JAVA코드 입력
- <%= ~~ %> : JSP 파일 내부에서 JAVA 코드 출력 결과 출력
MVC ( Servlet + JSP )
- MVC 적용 이유
- 유지보수의 어려움 ( 한 파일에 다 몰아져있기에 찾기가 힘들다 )
- 변경주기의 다름 (변경주기가 다르다면 분리하는 것이 맞음)
- MVC 구성
- Controller ( 비즈니스 로직 ) → Model ( 컨트롤에서 나온 데이터를 담아둠 ) → View ( 모델에 있는 데이터를 활용해서 화면 구성 )
- Controller 세부 구성
- 컨트롤러는 말 그대로 제어하는 역할 ( 서비스 + 리포지토리을 호출해서 사용)
- 서비스 : controller가 서비스를 통해 비즈니스 로직 구현
- 리포지토리 : 비즈니스 로직에 필요한 데이터를 저장하고 호출하는 역할
MVC 적용
- 구성
- Controller : Servlet
- setAttribute로 전달
- View : JSP
- getAttribute로 view 템플릿에서 값 사용
- 템플릿 엔진에서 따로 제공해주는 것을 이용해서 편리하게 값을 꺼내 쓸수 있음
- Controller : Servlet
- WEB-INF 디렉토리 밑에 있는 jsp 는 클라이언트가 url로 호출할 수 없음
- Controller에서 호출해야 view 가능
관련 문서
- [(학습/개발 (CS)/언어/JAVA/웹개발/SERVLET & JSP) Servlet 기초](../../개발 (CS)/언어/JAVA/웹개발/SERVLET%20&%20JSP/Servlet%20기초.md) — 이 노트의 “서블릿” 절에서 다룬 HttpServlet 상속·생명주기를 코드 예제로 더 상세히 다루는 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/SERVLET & JSP) MVC 패턴 ( Servlet + JSP )](../../개발 (CS)/언어/JAVA/웹개발/SERVLET%20&%20JSP/MVC%20패턴%20(%20Servlet%20+%20JSP%20).md) — 이 노트의 “MVC ( Servlet + JSP )” 절을 실제 코드 구현으로 확장한 노트
- [(학습/개발 (CS)/언어/JAVA/웹개발/SERVLET & JSP) JSP 이론 및 기초 문법](../../개발 (CS)/언어/JAVA/웹개발/SERVLET%20&%20JSP/JSP%20이론%20및%20기초%20문법.md) — 이 노트의 “JSP” 절에서 다룬 <% %>, <%= %> 문법을 더 상세히 다루는 노트